///**
// *
// */
//package com.kun.comm;
//
//import com.isuwang.basic.utils.CustomerSession;
//import com.isuwang.soa.crmdb.customer.domain.TCustomer;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.util.StringUtils;
//import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.Enumeration;
//import java.util.UUID;
//
///**
// * 日志记录
// *
// * @author caiwb
// */
//public class LoggerInterceptorAdapter extends HandlerInterceptorAdapter {
//
//	private static final Logger LOGGER = LoggerFactory.getLogger(LoggerInterceptorAdapter.class);
//	private static final String CLIENT_INFO = "_ClientInfo";
//	public static ThreadLocal<String> session = new ThreadLocal<String>();
//	@Override
//	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//		TCustomer currentUser = CustomerSession.getCurrentCustomer();
//		final Date requestTime = new Date();
//		final String url = request.getRequestURL().toString();
//		final String uuid= UUID.randomUUID().toString();
//		session.set(uuid);
//		final String ip = getClientIPAddress(request);
//		final String userName = currentUser != null ? currentUser.name : "-";
//
//		final ClientInfo clientInfo = new ClientInfo();
//		clientInfo.setIp(ip);
//		clientInfo.setRequestTime(requestTime);
//		clientInfo.setUrl(url);
//		request.setAttribute(CLIENT_INFO, clientInfo);
//
//		try {
//			return super.preHandle(request, response, handler);
//		} finally {
//			StringBuffer requestLog = new StringBuffer("SESSIONID:" + uuid +" 请求包:").append("\n")
//				.append(" 请求地址:").append(ip).append("\n")
//				.append(" 服务接口:").append(url).append("\n")
//				.append(" 请求时间:").append(toFormatTime(requestTime)).append("\n")
//				.append(" 会员名称:").append(userName).append("\n")
//				.append(" 浏览器名:").append(request.getHeader("User-Agent")).append("\n")
//				;
//			Enumeration headerNames = request.getHeaderNames();
//			requestLog.append(" 请求头: ");
//			while (headerNames.hasMoreElements()) {
//				String key = (String) headerNames.nextElement();
//				String value = request.getHeader(key);
//				requestLog.append(key + "---" + value).append("\n");
//			}
//			LOGGER.info(requestLog.toString());
//		}
//	}
//
//	@Override
//	public void afterCompletion(HttpServletRequest request,
//                                HttpServletResponse response, Object handler, Exception ex)
//			throws Exception {
//		try {
//			super.afterCompletion(request, response, handler, ex);
//		} finally {
//			if(ex != null)
//				LOGGER.error(ex.getMessage(), ex);
//			TCustomer currentUser = CustomerSession.getCurrentCustomer();
//			final String userName = currentUser != null ? currentUser.name : "-";
//			final ClientInfo clientInfo = (ClientInfo) request.getAttribute(CLIENT_INFO);
//
//			final long spendTimes = spendTime(clientInfo !=null ? clientInfo.getRequestTime() : null);
//			StringBuffer responseLog = new StringBuffer("SESSIONID:" + session.get() +" 返回包:").append("\n")
//				.append(" 请求地址:").append(clientInfo != null ? clientInfo.getIp() : "-").append("\n")
//				.append(" 服务接口:").append(clientInfo != null ? clientInfo.getUrl() : "-").append("\n")
//				.append(" 返回时间:").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss S").format(new Date())).append("\n")
//				.append(" 会员名称:").append(userName).append("\n")
//				.append(" 是否异常:").append(ex == null ? "-" : "Yes").append("\n")
//				.append(" 服务耗时:").append( spendTimes + "毫秒")
//				;
//			if(spendTimes > 1200) {
//				responseLog.append(",属于慢服务需要优化");
//			}
//			LOGGER.info(responseLog.toString());
//		}
//	}
//
//	protected long spendTime(final Date requestTime) {
//		if(requestTime == null)
//			return -1;
//
//		return System.currentTimeMillis() - requestTime.getTime();
//	}
//
//	protected String toFormatTime(final Date requestTime) {
//		return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss S").format(requestTime);
//	}
//
//	protected static String getClientIPAddress(HttpServletRequest request) {
//		String ip = request.getHeader("X-Real-IP");
//		if(StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
//			ip = request.getHeader("x-forwarded-for");
//		}
//	    if(StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
//	        ip = request.getHeader("Proxy-Client-IP");
//	    }
//	    if(StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
//	        ip = request.getHeader("WL-Proxy-Client-IP");
//	    }
//	    if(StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) {
//	        ip = request.getRemoteAddr();
//	    }
//	    return ip;
//	}
//
//	static class ClientInfo {
//		Date requestTime = new Date();
//		String ip = "";
//		String url = "";
//
//		public Date getRequestTime() {
//			return requestTime;
//		}
//
//		public void setRequestTime(Date requestTime) {
//			this.requestTime = requestTime;
//		}
//
//		public String getIp() {
//			return ip;
//		}
//
//		public void setIp(String ip) {
//			this.ip = ip;
//		}
//
//		public String getUrl() {
//			return url;
//		}
//
//		public void setUrl(String url) {
//			this.url = url;
//		}
//	}
//}
